package com.ssy.lingxi.member.merchant.service.base;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.entity.MemberRelationDO;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.MemberTypeIdVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.RoleIdVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.MemberTypeIdAndNameVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.UpperMemberShowVO;
import com.ssy.lingxi.member.merchant.model.vo.info.request.MemberInfoAddRoleVO;
import com.ssy.lingxi.member.merchant.model.vo.info.request.MemberInfoUpdateDepositDetailVO;
import com.ssy.lingxi.member.merchant.model.vo.info.request.MemberInfoUpdateRegisterDetailVO;
import com.ssy.lingxi.member.merchant.model.vo.info.response.*;
import com.ssy.lingxi.member.merchant.model.vo.lifecycle.response.MemberAppraisalPageQueryVO;
import com.ssy.lingxi.member.merchant.model.vo.lifecycle.response.MemberCreditComplaintPageQueryVO;
import com.ssy.lingxi.member.merchant.model.vo.lifecycle.response.MemberRecordRectifyVO;
import com.ssy.lingxi.member.merchant.model.vo.maintenance.request.MemberDetailCreditHistoryPageVO;
import com.ssy.lingxi.member.merchant.model.vo.maintenance.response.*;
import com.ssy.lingxi.member.merchant.model.vo.mobile.request.MobileUpdateDepositDetailVO;
import com.ssy.lingxi.member.merchant.model.vo.mobile.response.MobileInfoApplyButtonVO;
import com.ssy.lingxi.member.merchant.model.vo.mobile.response.MobileUpdateDepositDetailQueryVO;
import com.ssy.lingxi.member.merchant.model.vo.platform.response.RoleRuleManageVO;
import com.ssy.lingxi.member.merchant.model.vo.validate.request.ValidateIdPageVO;
import com.ssy.lingxi.member.merchant.model.vo.validate.response.MemberValidateDetailLevelVO;

import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 会员信息管理查询服务接口
 * @author 万宁
 * @version 2.0.0
 * @date 2020-09-05
 */
public interface IBaseMemberInfoService {

    /**
     * 获取分页查询页面下拉框内容
     * @return 下拉框内容
     */
    Wrapper<MemberInfoSearchConditionVO> getPageSearchConditions();

    /**
     * 分页、模糊查询归属会员列表（带积分权益）
     * @param subMemberId 下级会员Id
     * @param subRoleId 下级会员角色Id
     * @param current 当前页
     * @param pageSize 每页行数
     * @return 查询结果
     */
    Wrapper<PageData<MobileInfoLevelRightQueryVO>> pageUpperMemberLevelRights(Long subMemberId, Long subRoleId, int current, int pageSize);

    /**
     * 分页、模糊查询归属会员列表
     * @param subMemberId 下级会员Id
     * @param subRoleId   下级会员角色Id
     * @param name 上级会员名称
     * @param startDate 申请起始日期，格式为yyyy-MM-dd
     * @param endDate   申请结束日期，格式为yyyy-MM-dd
     * @param outerStatus 审核状态（外部）
     * @param current 当前页（从1开始）
     * @param pageSize 每页行数
     * @param enableMultiTenancy 是否开启SAAS多租户部署
     * @return 查询结果
     */
    Wrapper<PageData<UpperMemberInfoVO>> pageUpperMembers(Long subMemberId, Long subRoleId, String name, String startDate, String endDate, Integer outerStatus, int current, int pageSize, Boolean enableMultiTenancy);

    /**
     * “申请会员”页面，查询申请按钮状态和文本
     * @param loginUser 登录用户
     * @param shopType 商城类型
     * @param upperMemberId 上级会员Id
     * @param upperRoleId 上级角色Id
     * @return 查询结果
     */
    Wrapper<MemberInfoApplyButtonVO> getApplyCondition(UserLoginCacheDTO loginUser, Integer shopType, Long upperMemberId, Long upperRoleId);

    /**
     * App - “申请会员”页面，查询申请按钮状态和文本
     * @param loginUser 登录用户
     * @param upperMemberId 上级会员Id
     * @param upperRoleId 上级角色Id
     * @return 查询结果
     */
    Wrapper<MobileInfoApplyButtonVO> getMobileApplyCondition(UserLoginCacheDTO loginUser, Long upperMemberId, Long upperRoleId);

    /**
     * “邀请会员”页面，查询邀请按钮状态和文本
     * @param loginUser 登录用户
     * @param shopType 商城类型
     * @param subMemberId 下级会员Id
     * @param subRoleId   下级角色Id
     * @return 查询结果
     */
    Wrapper<MemberInfoInviteButtonVO> getInviteCondition(UserLoginCacheDTO loginUser, Integer shopType, Long subMemberId, Long subRoleId);

    /**
     * “申请会员”页面，会员注册资料信息
     * @param loginUser 登录用户
     * @param upperMemberId 上级会员Id
     * @param upperRoleId 上级会员角色Id
     * @return 查询结果
     */
    Wrapper<MemberInfoApplyRegisterDetailVO> getApplyRegisterDetail(UserLoginCacheDTO loginUser, Long upperMemberId, Long upperRoleId);

    /**
     * “申请会员”页面，会员入库资料信息
     * @param loginUser 登录用户
     * @param upperMemberId 上级会员Id
     * @param upperRoleId 上级会员角色Id
     * @return 查询结果
     */
    Wrapper<MemberInfoApplyDepositDetailVO> getApplyDepositDetail(UserLoginCacheDTO loginUser, Long upperMemberId, Long upperRoleId);

    /**
     * 获取“修改会员信息”页面，会员注册资料信息
     * @param loginUser 登录用户
     * @param validateId 会员关系Id
     * @return 查询结果
     */
    Wrapper<MemberInfoUpdateDetailVO> getMemberRegisterDetail(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * App - 获取“修改会员信息”页面，会员注册资料信息
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 操作结果
     */
    Wrapper<MobileInfoUpdateDetailVO> getMobileMemberRegisterDetail(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 修改会员注册信息
     * @param loginUser 登录用户
     * @param detailVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateMemberRegisterDetail(UserLoginCacheDTO loginUser, MemberInfoUpdateRegisterDetailVO detailVO);

    /**
     * 获取“修改会员信息”页面，会员入库资料信息
     * @param loginUser 登录用户
     * @param validateId 会员关系Id
     * @return 查询结果
     */
    Wrapper<MemberInfoUpdateDepositDetailQueryVO> getMemberDepositDetail(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * App - 获取“修改会员信息”页面，会员入库资料信息
     * @param loginUser 登录用户
     * @param upperMemberId 上级会员Id
     * @param upperRoleId   上级会员角色Id
     * @return 查询结果
     */
    Wrapper<MobileUpdateDepositDetailQueryVO> getMemberDepositDetail(UserLoginCacheDTO loginUser, Long upperMemberId, Long upperRoleId);

    /**
     * App - 修改会员入库信息
     * @param loginUser 登录用户
     * @param detailVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateMobileDepositDetail(UserLoginCacheDTO loginUser, MobileUpdateDepositDetailVO detailVO);

    /**
     * 修改会员入库信息
     * @param loginUser 登录用户
     * @param detailVO 接口参数
     * @return 修改结果
     */
    Wrapper<Void> updateMemberDepositDetail(UserLoginCacheDTO loginUser, MemberInfoUpdateDepositDetailVO detailVO);

    /**
     * 会员详情 - 会员基本信息
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberInfoBasicDetailVO> getMemberBasicDetail(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * App - 会员基本信息
     * @param relationDO 会员关系
     * @return 查询结果
     */
    Wrapper<MobileInfoBasicDetailVO> getMobileMemberBasicDetail(MemberRelationDO relationDO);

    /**
     * 会员详情 - 会员档案信息（入库信息）
     * @param loginUser 登录用户
     * @param validateId 会员关系Id
     * @return 查询结果
     */
    Wrapper<MemberInfoDepositDetailVO> getMemberArchives(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 会员详情- 会员档案 - 分页查询考评信息
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberAppraisalPageQueryVO>> pageMemberAppraisal(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO);

    /**
     * 会员详情 - 会员档案 - 分页查询整改信息
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberRecordRectifyVO>> pageMemberRecordRectify(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO);

    /**
     * 会员详情 - 会员等级信息
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberValidateDetailLevelVO> getMemberDetailLevel(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 会员详情 - 会员等级信息 - 分页查询交易分获取记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @param formatter 日期时间格式
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailLevelHistoryVO>> pageMemberLevelDetailHistory(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO, DateTimeFormatter formatter);

    /**
     * 会员详情 - 会员等级信息 - 分页查询交易分获取记录
     * @param relationDO 会员关系
     * @param current 当前页
     * @param pageSize 每页行数
     * @param formatter 日期时间格式
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailLevelHistoryVO>> pageMemberLevelDetailHistory(MemberRelationDO relationDO, int current, int pageSize, DateTimeFormatter formatter);

    /**
     * 会员详情 - 会员权益信息
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberDetailRightVO> getMemberDetailRight(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 会员详情 - 会员权益信息 - 分页查询会员权益获取记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @param formatter 日期时间格式
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailRightHistoryVO>> pageMemberDetailRightHistory(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO, DateTimeFormatter formatter);

    /**
     * 会员详情 - 会员权益信息 - 分页查询会员权益使用记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @param formatter 日期时间格式
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailRightSpendHistoryVO>> pageMemberDetailRightSpendHistory(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO, DateTimeFormatter formatter);

    /**
     * 会员详情 - 会员信用信息
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberDetailCreditVO> getMemberDetailCredit(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 会员详情 - 会员信用信息 - 交易评价汇总
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberDetailCreditCommentSummaryVO> getMemberDetailCreditTradeCommentSummary(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * App - 会员信用 - 交易评价汇总
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MobileCommentSummaryVO> getMobileMemberDetailTradeCommentSummary(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * 会员详情 - 会员信用 - 分页查询交易评论历史记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailCreditTradeHistoryVO>> pageMemberDetailCreditTradeCommentHistory(UserLoginCacheDTO loginUser, MemberDetailCreditHistoryPageVO pageVO);

    /**
     * 会员详情 - 会员信用信息 - 售后评价汇总
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberDetailCreditCommentSummaryVO> getMemberDetailCreditAfterSaleCommentSummary(UserLoginCacheDTO loginUser, Long validateId);

    /**
     * App - 会员信用 - 售后评价汇总
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MobileCommentSummaryVO> getMobileMemberDetailCreditAfterSaleCommentSummary(UserLoginCacheDTO loginUser, Long validateId);


    /**
     * 会员详情 - 会员信用 - 分页查询售后评论历史记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberDetailCreditAfterSaleHistoryVO>> pageMemberDetailCreditAfterSaleCommentHistory(UserLoginCacheDTO loginUser, MemberDetailCreditHistoryPageVO pageVO);


    /**
     * 会员详情 - 会员信用 - 投诉汇总
     * @param loginUser 登录用户
     * @param validateId 接口参数
     * @return 查询结果
     */
    Wrapper<MemberDetailCreditComplainSummaryVO> getMemberDetailCreditComplainSummary(UserLoginCacheDTO loginUser, Long validateId);


    /**
     * 会员详情 - 会员信用 - 分页查询投诉历史记录
     * @param loginUser 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<MemberCreditComplaintPageQueryVO>> pageMemberDetailCreditComplainHistory(UserLoginCacheDTO loginUser, ValidateIdPageVO pageVO);

    /**
     * “增加会员角色”功能，查询上级会员列表
     * @param subMemberId        下级会员id
     * @param subRoleId          下降会员角色id
     * @param enableMultiTenancy 是否开启pass多租户配置
     * @return 查询结果
     */
    Wrapper<UpperMemberShowVO> getUpperMemberInfo(Long subMemberId, Long subRoleId, Boolean enableMultiTenancy);

    /**
     * “增加会员角色”功能，查询会员类型列表
     * @param memberTypeEnum 当前会员的会员类型
     * @return 查询结果
     */
    Wrapper<List<MemberTypeIdAndNameVO>> getMemberTypeList(Integer memberTypeEnum);

    /**
     * “增加会员角色”功能，查询会员适用类型列表（saas）
     * @param memberTypeEnum 当前会员的会员类型
     * @param roleManageVOList 会员适用角色list
     * @return 查询结果
     */
    Wrapper<List<MemberTypeIdAndNameVO>> getMemberTypeList(Integer memberTypeEnum, List<RoleRuleManageVO> roleManageVOList);

    /**
     * “增加会员角色”功能，根据会员类型Id查询角色列表
     * @param subMemberId 下级会员Id
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<MemberInfoRoleListVO> getRoleListByMemberType(Long subMemberId, MemberTypeIdVO idVO);

    /**
     * “增加会员角色”功能，根据会员类型Id查询角色列表(saas)
     * @param memberId         会员id
     * @param idVO             接口参数
     * @param roleManageVOList 会员适用角色list
     * @return 查询结果
     */
    Wrapper<MemberInfoRoleListVO> getRoleListByMemberType(Long memberId, MemberTypeIdVO idVO, List<RoleRuleManageVO> roleManageVOList);

    /**
     * “增加会员角色”功能，会获取员注册资料信息
     * @param subMemberId 下级会员Id
     * @param subRoleId  下级会员角色Id
     * @param roleIdVO 接口参数
     * @return 查询结果
     */
    Wrapper<MemberInfoUpdateDetailByRoleVO> getMemberRegisterDetailAfterAddRole(Long subMemberId, Long subRoleId, RoleIdVO roleIdVO);

    /**
     * “增加会员角色”功能，提交注册资料并新增角色
     * @param subMemberId 下级会员Id
     * @param subRoleId  下级会员角色Id
     * @param addRoleVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> addMemberRole(Long subMemberId, Long subRoleId, MemberInfoAddRoleVO addRoleVO);
}
